#!/usr/bin/python3
# _*_ coding: utf-8 _*_
#
# Copyright (C) 2023 - 2023 heihieyouheihei, Inc. All Rights Reserved 
#
# @Time    : 2023/1/7 10:34
# @Author  : heihieyouheihei
# @File    : base5_grammar_12.py
# @IDE     : PyCharm

# 从这节课开始使用re模块实现正则表达式操作
# 在Python中提供了re模块, re模块是可以实现正则表达式的操作, 但是在使用re模块的时候需要使用import re引用这个模块
# re模块中常用的3种方法
# 1.匹配字符串
# 2.替换字符串
# 3.使用正则表达式分割字符串

# 1.匹配字符串也就是查找字符串,主要有3中方法:match(); search(); findall()都可以实现匹配字符串
# match()方法 只是 只是 只是 从字符串的开始处进行匹配, 如果起始位置匹配成功,那么就返回一个Match的对象否则就返回None值
# re.match(pattern, string, [flags]) 第一个参数是要匹配的模式字符串, 第二个参数是要匹配的字符串, 前两个参数必选,最后一个参数是可选参数用来控制匹配方式(比如:re.l 不区分字母大小写; re.A 让\w不匹配汉字)

import re
pattern = r'mr_\w'    # 定义一个模式字符串,在''前面加上r就是使用原生字符,匹配以"mr"开头的字符串,后面跟上"\w"
string = 'MR_SHOP mr_shop'    # 要匹配的字符串
match = re.match(pattern,string,re.I)    # 匹配字符串, (re.I不区分大小写,在默认情况下是区分大小写的)
print("输出匹配结果:",match)
# 如果获取的内容不存在就不能调用下面几个方法
print("匹配的起始位置(索引值): ",match.start())
print("匹配的结束位置(索引值): ",match.end())
print("匹配的数据: ",match.group())
print('\n')

# 实例: 应用正则表达式验证输入的手机号码是否合法.
# 13634222222 是有效的中国移动手机号码.
# 13144222221 不是有效的中国移动手机号码.
import re
pattern = r'(13[4-9]\d{8})|(15[01289]\d{8})$'    # 模式字符串 13开头第3位数字在[4--9]中选择,后面是连续的8位数字
mobile = "13634222222"    # 要匹配的手机号码
match1 = re.match(pattern, mobile)    # 把匹配结果放到match1中
if match1 == None:
    print(mobile,"不是有有效的中国移动手机号码")
else:
    print(mobile,"是有效的中国移动手机号码")

print('\n')

# search()方法在整个字符串当中搜索第一个 第一个 匹配成功的值, 如果匹配成功就返回Match的对象,如果匹配不成功就返回None的值
# re.search(pattern, string, [flags])    re.方法名(模式字符串,要匹配的字符串,标志位这个标志位和match方法一样)
pattern1 = r'mr_\w'    # 定义一个模式字符串,在''前面加上r就是使用原生字符,匹配以"mr"开头的字符串,后面跟上"\w"
string1 = '项目名称: MR_SHOP mr_shop'    # 要匹配的字符串
match2 = re.search(pattern1,string1,re.I)    # 匹配字符串, (re.I不区分大小写,在默认情况下是区分大小写的)
print("输出匹配结果:",match2)
# 如果获取的内容不存在就不能调用下面几个方法
print("search方法匹配的起始位置(索引值): ",match2.start())
print("search方法匹配的结束位置(索引值): ",match2.end())
print("search方法匹配的数据: ",match2.group())

print("\n")
# 实例: 验证是否出现危险字符.
# 我是一名程序员, 我喜欢看黑客方面的数, 想研究一下Trojan. @ 出现了危险词汇!
# 我是一名程序员, 我喜欢看计算机网络方面的图书, 喜欢开发网站. @ 安全!
pattern2 = r'(黑客)|(抓包)|(监听)|(Trojan)'    # 模式字符串
about = '我是一名程序员, 我喜欢看计算机网络方面的图书, 喜欢开发网站.'
match3 = re.search(pattern2,about)
if match3 == None:
    print(about,"@ 安全!")
else:
    print(about,"@ 出现了危险词汇!")

print('\n')
# findall()用来在这个字符串当中搜索所有符合正则表达式的字符串,并且以列表的形式进行返回,如果匹配成功就会返回一个包含结果的列表,否则就返回一个空列表
# re.findall(pattern, string, [flags]) re.方法名(模式字符串, 要匹配的字符串, 标志位(这个标志位和前面的方法一样))
pattern3 = r'mr_\w'    # 定义一个模式字符串,在''前面加上r就是使用原生字符,匹配以"mr"开头的字符串,后面跟上"\w"
string3 = '项目名称: MR_SHOP mr_shop'    # 要匹配的字符串
match3 = re.findall(pattern3,string3,re.I)    # 匹配字符串, (re.I不区分大小写,在默认情况下是区分大小写的)
print("输出匹配结果是一个列表不是match对象:",match3)

